{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 数据预处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/home/malele/anaconda3/lib/python3.6/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n",
      "  from ._conv import register_converters as _register_converters\n",
      "Using TensorFlow backend.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "X_train shape: (3827, 200, 6, 1)\n",
      "Y_train shape: (3827, 16)\n",
      "X_test shape: (957, 200, 6, 1)\n",
      "Y_test shape: (957, 16)\n"
     ]
    }
   ],
   "source": [
    "import h5py\n",
    "import numpy as np\n",
    "import tensorflow as tf \n",
    "import keras\n",
    "from keras.layers import Input, Dense, Dropout, Activation, BatchNormalization,concatenate, Flatten, Conv2D, AveragePooling2D, MaxPooling2D\n",
    "from keras.models import Model\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "def convert_to_one_hot(Y, C):\n",
    "    Y = np.eye(C)[Y.reshape(-1)].T\n",
    "    return Y\n",
    "\n",
    "file = h5py.File('DB3//DB3_S4_image.h5','r')\n",
    "imageData   = file['imageData'][:]\n",
    "imageData   = imageData*2000\n",
    "imageLabel  = file['imageLabel'][:]  \n",
    "file.close()\n",
    "\n",
    "# 随机打乱数据和标签\n",
    "N = imageData.shape[0]\n",
    "index = np.random.permutation(N)\n",
    "data  = imageData[index,:,:]\n",
    "label = imageLabel[index]\n",
    "\n",
    "# 对数据升维,标签one-hot\n",
    "data  = np.expand_dims(data, axis=3)\n",
    "label = convert_to_one_hot(label,16).T\n",
    "\n",
    "# 划分数据集\n",
    "N = data.shape[0]\n",
    "num_train = round(N*0.8)\n",
    "X_train = data[0:num_train,:,:,:]\n",
    "Y_train = label[0:num_train,:]\n",
    "X_test  = data[num_train:N,:,:,:]\n",
    "Y_test  = label[num_train:N,:]\n",
    "\n",
    "print (\"X_train shape: \" + str(X_train.shape))\n",
    "print (\"Y_train shape: \" + str(Y_train.shape))\n",
    "print (\"X_test shape: \" + str(X_test.shape))\n",
    "print (\"Y_test shape: \" + str(Y_test.shape))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "#写一个LossHistory类，保存loss和acc\n",
    "class LossHistory(keras.callbacks.Callback):\n",
    "    def on_train_begin(self, logs={}):\n",
    "        self.losses = {'batch':[], 'epoch':[]}\n",
    "        self.accuracy = {'batch':[], 'epoch':[]}\n",
    "        self.val_loss = {'batch':[], 'epoch':[]}\n",
    "        self.val_acc = {'batch':[], 'epoch':[]}\n",
    "\n",
    "    def on_batch_end(self, batch, logs={}):\n",
    "        self.losses['batch'].append(logs.get('loss'))\n",
    "        self.accuracy['batch'].append(logs.get('acc'))\n",
    "        self.val_loss['batch'].append(logs.get('val_loss'))\n",
    "        self.val_acc['batch'].append(logs.get('val_acc'))\n",
    "\n",
    "    def on_epoch_end(self, batch, logs={}):\n",
    "        self.losses['epoch'].append(logs.get('loss'))\n",
    "        self.accuracy['epoch'].append(logs.get('acc'))\n",
    "        self.val_loss['epoch'].append(logs.get('val_loss'))\n",
    "        self.val_acc['epoch'].append(logs.get('val_acc'))\n",
    "\n",
    "    def loss_plot(self, loss_type):\n",
    "        iters = range(len(self.losses[loss_type]))\n",
    "        plt.figure()\n",
    "        # acc\n",
    "        plt.plot(iters, self.accuracy[loss_type], 'r', label='train acc')\n",
    "        # loss\n",
    "        plt.plot(iters, self.losses[loss_type], 'g', label='train loss')\n",
    "        if loss_type == 'epoch':\n",
    "            # val_acc\n",
    "            plt.plot(iters, self.val_acc[loss_type], 'b', label='val acc')\n",
    "            # val_loss\n",
    "            plt.plot(iters, self.val_loss[loss_type], 'k', label='val loss')\n",
    "        plt.grid(True)\n",
    "        plt.xlabel(loss_type)\n",
    "        plt.ylabel('acc-loss')\n",
    "        plt.legend(loc=\"upper right\")\n",
    "        plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 建立模型"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "input_1 (InputLayer)         (None, 200, 6, 1)         0         \n",
      "_________________________________________________________________\n",
      "conv2d_1 (Conv2D)            (None, 200, 6, 32)        672       \n",
      "_________________________________________________________________\n",
      "conv2d_2 (Conv2D)            (None, 200, 6, 32)        3104      \n",
      "_________________________________________________________________\n",
      "max_pooling2d_1 (MaxPooling2 (None, 10, 6, 32)         0         \n",
      "_________________________________________________________________\n",
      "conv2d_3 (Conv2D)            (None, 10, 6, 64)         6208      \n",
      "_________________________________________________________________\n",
      "conv2d_4 (Conv2D)            (None, 10, 6, 64)         12352     \n",
      "_________________________________________________________________\n",
      "max_pooling2d_2 (MaxPooling2 (None, 5, 6, 64)          0         \n",
      "_________________________________________________________________\n",
      "conv2d_5 (Conv2D)            (None, 5, 6, 128)         24704     \n",
      "_________________________________________________________________\n",
      "flatten (Flatten)            (None, 3840)              0         \n",
      "_________________________________________________________________\n",
      "dropout_1 (Dropout)          (None, 3840)              0         \n",
      "_________________________________________________________________\n",
      "dense_1 (Dense)              (None, 128)               491648    \n",
      "_________________________________________________________________\n",
      "dropout_2 (Dropout)          (None, 128)               0         \n",
      "_________________________________________________________________\n",
      "dense_2 (Dense)              (None, 16)                2064      \n",
      "=================================================================\n",
      "Total params: 540,752\n",
      "Trainable params: 540,752\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n"
     ]
    }
   ],
   "source": [
    "def CNN(input_shape=(200,6,1), classes=16): \n",
    "    X_input = Input(input_shape)\n",
    "    \n",
    "    X = Conv2D(filters=32, kernel_size=(20,1), strides=(1,1), activation='relu', padding='same')(X_input)\n",
    "    X = Conv2D(filters=32, kernel_size=(1,3), strides=(1,1), activation='relu', padding='same')(X)\n",
    "    X = MaxPooling2D((20,1), strides=(20,1))(X)\n",
    "\n",
    "    X = Conv2D(filters=64, kernel_size=(3,1), strides=(1,1), activation='relu', padding='same')(X)\n",
    "    X = Conv2D(filters=64, kernel_size=(1,3), strides=(1,1), activation='relu', padding='same')(X)\n",
    "    X = MaxPooling2D((2,1), strides=(2,1))(X)\n",
    "    \n",
    "    X = Conv2D(filters=128, kernel_size=(3,1), strides=(1,1), activation='relu',padding='same')(X)\n",
    "    \n",
    "    X = Flatten(name='flatten')(X)\n",
    "    X = Dropout(0.5)(X)\n",
    "    X = Dense(128,activation='relu')(X)\n",
    "    X = Dropout(0.5)(X)\n",
    "    X = Dense(classes, activation='softmax')(X)\n",
    "    model = Model(inputs=X_input, outputs=X)\n",
    "    return model\n",
    "    \n",
    "model = CNN(input_shape = (200, 6, 1), classes = 16)\n",
    "model.summary()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 训练原始数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Train on 3827 samples, validate on 957 samples\n",
      "Epoch 1/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 2.2650 - acc: 0.2519 - val_loss: 1.4657 - val_acc: 0.4828\n",
      "Epoch 2/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 1.4318 - acc: 0.4973 - val_loss: 1.0197 - val_acc: 0.6353\n",
      "Epoch 3/100\n",
      "3827/3827 [==============================] - 4s 965us/step - loss: 1.0901 - acc: 0.6096 - val_loss: 0.7869 - val_acc: 0.7356\n",
      "Epoch 4/100\n",
      "3827/3827 [==============================] - 4s 977us/step - loss: 0.9407 - acc: 0.6546 - val_loss: 0.7188 - val_acc: 0.7262\n",
      "Epoch 5/100\n",
      "3827/3827 [==============================] - 4s 958us/step - loss: 0.8642 - acc: 0.6854 - val_loss: 0.6710 - val_acc: 0.7534\n",
      "Epoch 6/100\n",
      "3827/3827 [==============================] - 4s 977us/step - loss: 0.7657 - acc: 0.7238 - val_loss: 0.6350 - val_acc: 0.7753\n",
      "Epoch 7/100\n",
      "3827/3827 [==============================] - 4s 953us/step - loss: 0.6885 - acc: 0.7541 - val_loss: 0.6334 - val_acc: 0.7649\n",
      "Epoch 8/100\n",
      "3827/3827 [==============================] - 4s 972us/step - loss: 0.6350 - acc: 0.7758 - val_loss: 0.5077 - val_acc: 0.8234\n",
      "Epoch 9/100\n",
      "3827/3827 [==============================] - 4s 967us/step - loss: 0.5974 - acc: 0.7842 - val_loss: 0.5071 - val_acc: 0.8182\n",
      "Epoch 10/100\n",
      "3827/3827 [==============================] - 4s 968us/step - loss: 0.6052 - acc: 0.7917 - val_loss: 0.5062 - val_acc: 0.8192\n",
      "Epoch 11/100\n",
      "3827/3827 [==============================] - 4s 970us/step - loss: 0.5651 - acc: 0.8064 - val_loss: 0.4954 - val_acc: 0.8171\n",
      "Epoch 12/100\n",
      "3827/3827 [==============================] - 4s 976us/step - loss: 0.5106 - acc: 0.8202 - val_loss: 0.4705 - val_acc: 0.8297\n",
      "Epoch 13/100\n",
      "3827/3827 [==============================] - 4s 960us/step - loss: 0.4899 - acc: 0.8257 - val_loss: 0.4305 - val_acc: 0.8464\n",
      "Epoch 14/100\n",
      "3827/3827 [==============================] - 4s 954us/step - loss: 0.4580 - acc: 0.8383 - val_loss: 0.4401 - val_acc: 0.8401\n",
      "Epoch 15/100\n",
      "3827/3827 [==============================] - 4s 970us/step - loss: 0.4441 - acc: 0.8492 - val_loss: 0.4321 - val_acc: 0.8422\n",
      "Epoch 16/100\n",
      "3827/3827 [==============================] - 4s 965us/step - loss: 0.4346 - acc: 0.8448 - val_loss: 0.4009 - val_acc: 0.8621\n",
      "Epoch 17/100\n",
      "3827/3827 [==============================] - 4s 990us/step - loss: 0.3874 - acc: 0.8678 - val_loss: 0.4075 - val_acc: 0.8474\n",
      "Epoch 18/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.3841 - acc: 0.8639 - val_loss: 0.3726 - val_acc: 0.8694\n",
      "Epoch 19/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.3707 - acc: 0.8696 - val_loss: 0.4217 - val_acc: 0.8568\n",
      "Epoch 20/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.3649 - acc: 0.8709 - val_loss: 0.3899 - val_acc: 0.8558\n",
      "Epoch 21/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.3451 - acc: 0.8811 - val_loss: 0.4097 - val_acc: 0.8589\n",
      "Epoch 22/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.3399 - acc: 0.8832 - val_loss: 0.3588 - val_acc: 0.8746\n",
      "Epoch 23/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.3096 - acc: 0.8913 - val_loss: 0.3537 - val_acc: 0.8788\n",
      "Epoch 24/100\n",
      "3827/3827 [==============================] - 5s 1ms/step - loss: 0.3312 - acc: 0.8869 - val_loss: 0.3981 - val_acc: 0.8631\n",
      "Epoch 25/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.3055 - acc: 0.8991 - val_loss: 0.3392 - val_acc: 0.8945\n",
      "Epoch 26/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.2872 - acc: 0.9004 - val_loss: 0.3465 - val_acc: 0.8767\n",
      "Epoch 27/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.2648 - acc: 0.9059 - val_loss: 0.3513 - val_acc: 0.8830\n",
      "Epoch 28/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.2491 - acc: 0.9088 - val_loss: 0.3671 - val_acc: 0.8788\n",
      "Epoch 29/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.3032 - acc: 0.8937 - val_loss: 0.3910 - val_acc: 0.8652\n",
      "Epoch 30/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.2463 - acc: 0.9099 - val_loss: 0.3438 - val_acc: 0.8851\n",
      "Epoch 31/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.2317 - acc: 0.9172 - val_loss: 0.3545 - val_acc: 0.8809\n",
      "Epoch 32/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.2250 - acc: 0.9190 - val_loss: 0.3700 - val_acc: 0.8830\n",
      "Epoch 33/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.2151 - acc: 0.9234 - val_loss: 0.4168 - val_acc: 0.8788\n",
      "Epoch 34/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.2230 - acc: 0.9229 - val_loss: 0.3733 - val_acc: 0.8767\n",
      "Epoch 35/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.2100 - acc: 0.9242 - val_loss: 0.3527 - val_acc: 0.8871\n",
      "Epoch 36/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.2069 - acc: 0.9227 - val_loss: 0.3898 - val_acc: 0.8798\n",
      "Epoch 37/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.2222 - acc: 0.9274 - val_loss: 0.3242 - val_acc: 0.8913\n",
      "Epoch 38/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.1837 - acc: 0.9334 - val_loss: 0.3396 - val_acc: 0.8945\n",
      "Epoch 39/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.1852 - acc: 0.9368 - val_loss: 0.3445 - val_acc: 0.8934\n",
      "Epoch 40/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.1855 - acc: 0.9300 - val_loss: 0.3707 - val_acc: 0.8934\n",
      "Epoch 41/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.1860 - acc: 0.9326 - val_loss: 0.4211 - val_acc: 0.8777\n",
      "Epoch 42/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.1791 - acc: 0.9360 - val_loss: 0.4143 - val_acc: 0.8819\n",
      "Epoch 43/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.1565 - acc: 0.9477 - val_loss: 0.3826 - val_acc: 0.8903\n",
      "Epoch 44/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.1646 - acc: 0.9428 - val_loss: 0.3823 - val_acc: 0.8767\n",
      "Epoch 45/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.1520 - acc: 0.9464 - val_loss: 0.3892 - val_acc: 0.8809\n",
      "Epoch 46/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.1464 - acc: 0.9459 - val_loss: 0.3577 - val_acc: 0.8976\n",
      "Epoch 47/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.1384 - acc: 0.9506 - val_loss: 0.3393 - val_acc: 0.8976\n",
      "Epoch 48/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.1781 - acc: 0.9375 - val_loss: 0.4161 - val_acc: 0.8861\n",
      "Epoch 49/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.1486 - acc: 0.9490 - val_loss: 0.3685 - val_acc: 0.8934\n",
      "Epoch 50/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.1372 - acc: 0.9527 - val_loss: 0.4192 - val_acc: 0.8777\n",
      "Epoch 51/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.1554 - acc: 0.9409 - val_loss: 0.3484 - val_acc: 0.8924\n",
      "Epoch 52/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.1563 - acc: 0.9467 - val_loss: 0.3768 - val_acc: 0.8997\n",
      "Epoch 53/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.1246 - acc: 0.9527 - val_loss: 0.3800 - val_acc: 0.8986\n",
      "Epoch 54/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.1385 - acc: 0.9517 - val_loss: 0.4387 - val_acc: 0.8809\n",
      "Epoch 55/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.1287 - acc: 0.9514 - val_loss: 0.3879 - val_acc: 0.8882\n",
      "Epoch 56/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.1105 - acc: 0.9605 - val_loss: 0.4024 - val_acc: 0.8819\n",
      "Epoch 57/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.1283 - acc: 0.9543 - val_loss: 0.4630 - val_acc: 0.8903\n",
      "Epoch 58/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.1188 - acc: 0.9569 - val_loss: 0.4689 - val_acc: 0.8662\n",
      "Epoch 59/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.1186 - acc: 0.9587 - val_loss: 0.4179 - val_acc: 0.8903\n",
      "Epoch 60/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.1085 - acc: 0.9608 - val_loss: 0.4300 - val_acc: 0.8777\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 61/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.1286 - acc: 0.9540 - val_loss: 0.4060 - val_acc: 0.8882\n",
      "Epoch 62/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.1369 - acc: 0.9545 - val_loss: 0.4694 - val_acc: 0.8767\n",
      "Epoch 63/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.1344 - acc: 0.9551 - val_loss: 0.4640 - val_acc: 0.8809\n",
      "Epoch 64/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.1128 - acc: 0.9600 - val_loss: 0.4259 - val_acc: 0.8903\n",
      "Epoch 65/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.0790 - acc: 0.9694 - val_loss: 0.4865 - val_acc: 0.8788\n",
      "Epoch 66/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.0993 - acc: 0.9666 - val_loss: 0.4059 - val_acc: 0.9049\n",
      "Epoch 67/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.1135 - acc: 0.9619 - val_loss: 0.4454 - val_acc: 0.8851\n",
      "Epoch 68/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.1362 - acc: 0.9488 - val_loss: 0.3904 - val_acc: 0.8903\n",
      "Epoch 69/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.1048 - acc: 0.9658 - val_loss: 0.4009 - val_acc: 0.8892\n",
      "Epoch 70/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.0914 - acc: 0.9652 - val_loss: 0.4027 - val_acc: 0.8934\n",
      "Epoch 71/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.0847 - acc: 0.9710 - val_loss: 0.4204 - val_acc: 0.8955\n",
      "Epoch 72/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.0891 - acc: 0.9673 - val_loss: 0.4235 - val_acc: 0.9007\n",
      "Epoch 73/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.0928 - acc: 0.9671 - val_loss: 0.5776 - val_acc: 0.8757\n",
      "Epoch 74/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.0901 - acc: 0.9679 - val_loss: 0.5157 - val_acc: 0.8819\n",
      "Epoch 75/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.0717 - acc: 0.9765 - val_loss: 0.4631 - val_acc: 0.8871\n",
      "Epoch 76/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.1036 - acc: 0.9679 - val_loss: 0.5363 - val_acc: 0.8788\n",
      "Epoch 77/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.0892 - acc: 0.9679 - val_loss: 0.4275 - val_acc: 0.8924\n",
      "Epoch 78/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.0788 - acc: 0.9747 - val_loss: 0.4347 - val_acc: 0.8976\n",
      "Epoch 79/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.0932 - acc: 0.9673 - val_loss: 0.4294 - val_acc: 0.8924\n",
      "Epoch 80/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.0891 - acc: 0.9686 - val_loss: 0.5313 - val_acc: 0.8757\n",
      "Epoch 81/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.0807 - acc: 0.9713 - val_loss: 0.6404 - val_acc: 0.8704\n",
      "Epoch 82/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.0981 - acc: 0.9621 - val_loss: 0.5521 - val_acc: 0.8715\n",
      "Epoch 83/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.0908 - acc: 0.9660 - val_loss: 0.4817 - val_acc: 0.8924\n",
      "Epoch 84/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.0718 - acc: 0.9731 - val_loss: 0.4699 - val_acc: 0.8913\n",
      "Epoch 85/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.0620 - acc: 0.9765 - val_loss: 0.5573 - val_acc: 0.8736\n",
      "Epoch 86/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.0819 - acc: 0.9731 - val_loss: 0.4265 - val_acc: 0.8955\n",
      "Epoch 87/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.0795 - acc: 0.9710 - val_loss: 0.4372 - val_acc: 0.8934\n",
      "Epoch 88/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.0756 - acc: 0.9747 - val_loss: 0.4152 - val_acc: 0.8966\n",
      "Epoch 89/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.0709 - acc: 0.9752 - val_loss: 0.4912 - val_acc: 0.8840\n",
      "Epoch 90/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.0896 - acc: 0.9663 - val_loss: 0.4925 - val_acc: 0.8830\n",
      "Epoch 91/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.0763 - acc: 0.9736 - val_loss: 0.5069 - val_acc: 0.8871\n",
      "Epoch 92/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.0717 - acc: 0.9762 - val_loss: 0.4998 - val_acc: 0.8819\n",
      "Epoch 93/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.0554 - acc: 0.9820 - val_loss: 0.4549 - val_acc: 0.9028\n",
      "Epoch 94/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.0617 - acc: 0.9801 - val_loss: 0.5252 - val_acc: 0.8934\n",
      "Epoch 95/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.0752 - acc: 0.9744 - val_loss: 0.5262 - val_acc: 0.8830\n",
      "Epoch 96/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.0789 - acc: 0.9728 - val_loss: 0.5153 - val_acc: 0.8767\n",
      "Epoch 97/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.0712 - acc: 0.9770 - val_loss: 0.4910 - val_acc: 0.8882\n",
      "Epoch 98/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.0788 - acc: 0.9760 - val_loss: 0.4904 - val_acc: 0.8934\n",
      "Epoch 99/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.0466 - acc: 0.9838 - val_loss: 0.5202 - val_acc: 0.8986\n",
      "Epoch 100/100\n",
      "3827/3827 [==============================] - 4s 1ms/step - loss: 0.0806 - acc: 0.9728 - val_loss: 0.4656 - val_acc: 0.8934\n",
      "3827/3827 [==============================] - 1s 252us/step\n",
      "Train Loss = 0.008545205782189272\n",
      "Train Accuracy = 0.9981708910373661\n",
      "957/957 [==============================] - 0s 244us/step\n",
      "Test Loss = 0.4656155633203911\n",
      "Test Accuracy = 0.8934169274637069\n",
      "time: 431.2286741733551\n"
     ]
    }
   ],
   "source": [
    "import time\n",
    "start = time.time()\n",
    "\n",
    "model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])\n",
    "history = LossHistory() # 创建一个history实例\n",
    "model.fit(X_train, Y_train, epochs=100, validation_data=(X_test, Y_test),batch_size=64,callbacks=[history])\n",
    "\n",
    "preds_train = model.evaluate(X_train, Y_train)\n",
    "print(\"Train Loss = \" + str(preds_train[0]))\n",
    "print(\"Train Accuracy = \" + str(preds_train[1]))\n",
    "\n",
    "preds_test  = model.evaluate(X_test, Y_test)\n",
    "print(\"Test Loss = \" + str(preds_test[0]))\n",
    "print(\"Test Accuracy = \" + str(preds_test[1]))\n",
    "\n",
    "end = time.time()\n",
    "print(\"time:\",end-start)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7f44332bbc50>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "history.loss_plot('epoch')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.4"
  },
  "toc": {
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": "block",
   "toc_window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
